<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>架构专栏特别放送 | “华仔，放学别走！” 第2期 </title>
    <link href=./css/app.css rel=stylesheet>
</head>
<body>
<div id="app"><div data-v-87ffcada="" class="article"><!----> <div data-v-87ffcada="" class="main main-app" style="margin-top: 0px;"><div data-v-87ffcada="" class="breadcrumb"><span><a href="/" class="title router-link-active">讲堂</a> <span class="split iconfont"></span></span><span><a href="/column/81" class="title">从0开始学架构</a> <span class="split iconfont"></span></span><span><span class="title">文章详情</span> <!----></span></div> <h1 data-v-87ffcada="" class="article-title">
    架构专栏特别放送 | “华仔，放学别走！” 第2期
</h1> <div data-v-87ffcada="" class="article-info"><span data-v-87ffcada="">2018-06-01</span> <span data-v-87ffcada="">何潇 &amp; 李运华</span></div> <div data-v-87ffcada="" class="article-content typo common-content"><img data-v-87ffcada="" src="https://static001.geekbang.org/resource/image/17/ba/174b089d7e1fac7d2b4c5350433d5aba.jpg"> <!----> <!----> <div data-v-87ffcada="" id="article-content" class=""><div class="text"><p>各位同学，晚上好，我是架构专栏的编辑 Shawn。今天又到周五啦，没错，我又出来送<span class="orange">福利</span>了 [捂脸]。</p>
    <p><a href="http://time.geekbang.org/column/article/7647">“华仔，放学别走”第 1 期</a>不知道你看了没有，华仔回答了关于知识分享、理论与实践、专栏学习方法、推荐的参考书等几个问题，希望你从中能够有所收获。今天是“华仔，放学别走”第 2 期，继续回答你所关注的问题，然后展示出 08 ~ 13 期被选中的精选留言，并给留言被选中的同学送出价值 68 元的专栏阅码。话不多说，开始今天的问答环节。</p>
    <p><span class="orange">Shawn：有做公司架构 / 网站架构 /App 架构的同学，这个专栏能帮助到他们吗？</span></p>
    <p>华仔：有的同学在学习了一段时间后跟我留言交流，说感觉专栏的内容好像比较适合做互联网后台架构，不太适合企业应用、客户端这类系统。其实这是一个误解，我之所以在前面花费很大篇幅来讲架构设计的目的、架构设计原则、架构设计流程等看起来比较偏理论的内容，而没有一上来就讲异地多活、高性能架构之类的怎么做，原因就在于<strong>这是一套完整的架构设计理论体系</strong>，不管是企业应用，还是客户端应用，都可以按照这个设计理论体系去操作。我以手机 App 为例，首先，我们分析一下 App 的复杂度主要来源是什么？通常情况下，App 的主要复杂度就是可扩展，因为要不断地开发新的需求；高性能和高可用也涉及，高性能主要和用户体验有关；高可用主要是减少崩溃。其次，再看 App 的架构需要遵循架构设计原则么？答案是肯定需要。刚开始为了业务快速开发，可能用“原生 +H5”混合架构；后来业务发展，功能更复杂了，H5 可能难以满足体验，架构又需要演进到“纯原生”；如果业务再发展，规模太庞大，则架构又可能需要演进到“组件化、容器化”。以上通过手机 App 的为例说明这套架构设计理论是通用的，有兴趣的同学可以按照这种方式分析一下企业应用，会发现这套理论也是适应的。</p>
    <p><span class="orange">Shawn：讲讲你总结“架构设计三原则”的过程吧？</span></p>
    <p>华仔：“架构设计三原则”是综合各方面的信息和思考得来的。首先是我自己的经验，包括成功的经验和失败的教训；其次是分析了很多业界的架构演讲和技术发展历史；第三是看了一些关于技术本质的书籍而受到的启发，例如《技术的本质》《系统之美》等。其实最初整理的架构设计原则有 10 多条，但我觉得 10 多条太多了，不聚焦也不利于理解，因此去芜存菁，最终得到了“架构设计三原则”，这三个原则是最重要也是最核心的。</p>
    <p>如下是我原来整理的设计原则：可以看到一共有 14 条：</p>
    <p><img src="https://static001.geekbang.org/resource/image/40/c9/401f88f46641147b1c90d876bfb297c9.png" alt=""></p>
    <p><span class="orange">Shawn：“PPT 架构师”的口头禅是“细节不讨论”，一个优秀的架构师，需要对细节有多少考虑呢？</span></p>
    <p>华仔：这是一个非常好的问题，也是很多同学困惑的问题，我分享一下我的做法，以我学习 Elasticsearch 为例，具体的做法是：</p>
    <ol>
        <li><p>搭建一个单机伪集群，搭建完成后看看安装路径下的文件和目录，看看配置文件有哪些配置项，不同的配置项会有什么样的影响。</p>
        </li>
        <li><p>执行常用的操作，例如创建索引，插入、删除、查询文档，查看一下各种输出。</p>
        </li>
        <li><p>研究其<strong>基本原理</strong>，例如索引、分片、副本等，研究的时候要多思考，例如索引应该如何建，分片数量和副本数量对系统有什么影响等。</p>
        </li>
        <li><p>和其他类似系统对比，例如 Solr、Sphinx，研究其<strong>优点、缺点、适用场景</strong>。</p>
        </li>
        <li><p>模拟一个案例看看怎么应用。例如，假设我用 Elasticsearch 来存储淘宝的商品信息，我应该如何设计索引和分片。</p>
        </li>
        <li><p>查看业界使用的案例，思考一下别人为何这么用；看看别人测试的结果，大概了解性能范围。</p>
        </li>
        <li><p>如果某部分特别有兴趣或者很关键，可能去看源码，例如 Elasticsearch 的选举算法（我目前还没看 ^_^）。</p>
        </li>
        <li><p>如果确定要引入，会进行性能和可用性测试。</p>
        </li>
    </ol>
    <p>这样一套组合拳下来，基本上能够满足在架构设计时进行选型判断，而且花费的时间也不多。我并不建议拿到一个系统一开始就去读源码，效率太低，而且效果也不好。</p>
    <p><span class="orange">Shawn：谈谈架构师沟通能力的重要性吧？</span></p>
    <p>华仔：架构师是业务和技术之间的桥梁，同时通常情况下还会确定整体项目的步骤。因此，架构师的沟通能力非常重要，既要说得动老板，让老板支持自己的设计决定；又要镇得住技术人员，让技术人员信服自己的设计选择；同时还要能够理解业务，结合业务不同发展阶段设计合适的架构，所以也要参与产品和项目决策。由于架构设计过程中存在很多判断和选择，而且不一定都有明确量化的标准，因此不同的人有不同的看法是普遍情况。这种情况下架构师既需要专业能力过硬，又需要具备良好的沟通技巧，才能促使业务、项目、技术三方达成一致。</p>
    <p>当然，<strong>架构师的核心能力还是技术能力，过硬的技术才是良好沟通的基础</strong>，否则单纯靠沟通技巧甚至花言巧语，一次两次可能奏效，但后面被打脸打多了，也就没人信任了。</p>
    <p><span class="orange">Shawn：有同学留言说，给企业做项目，甲方会不顾业务需要，只要是业界流行的技术就要求在项目中采用，这种情况下怎样才能符合“架构设计三原则”？</span></p>
    <p>华仔：首先，业务第一，先把订单签下来，才有后面的架构设计，如果硬要说甲方的要求不合理，不满足“架构设计三原则”，结果订单都拿不到，那是没有意义的。其次，这种情况我把它归为“架构约束”，即这不是架构师能够选择的，而是架构师必须遵守的，因此这里不需要使用“架构设计三原则”来判断。第三，这种情况下，架构师还是可以应用“架构设计三原则”来指导架构设计，比如说客户要求采用 Docker，Docker 的网络模式有 5 种，host 模式使用起来比 bridge 模式简单，那我们就用 host 模式；如果客户再要求需要对 Docker 进行统一管理，那我们是自己研发 Docker 管理平台，还是直接用 Kubernetes 呢？按照简单原则来说，肯定用 Kubernetes 了。</p>
    <p>通过这个示例也可以看出，“架构设计三原则”主要是指架构师在选择和判断时采取的指导原则；但如果是架构的基本需求或者约束必须被满足时，架构师此时的选择是采取什么样的方案能够更好的满足这些需求和约束。</p>
    <h2 id="-">留言精选</h2>
    <p><img src="https://static001.geekbang.org/resource/image/4b/a3/4b3f1ab66a7c470970c67da62ec99da3.jpeg" alt=""></p>
    <p>华仔：有个懂技术的好老大是一件多么幸福的事情：）</p>
    <hr>
    <p><img src="https://static001.geekbang.org/resource/image/7c/9c/7ce774f26c16292a596ac4489c60369c.jpeg" alt=""></p>
    <p>华仔：有钱也不能任性，微软 95 年也不可能开发出 Windows 10 操作系统；业务量大了重构甚至重写那是自然而然的，不会浪费也不会导致错失产品机会，Windows、Android、淘宝、QQ 都是这么过来的。</p>
    <hr>
    <p><img src="https://static001.geekbang.org/resource/image/40/8c/402a833915524ab1b572da8ddc34ab8c.jpeg" alt=""></p>
    <p>华仔：终于明白了我一开始就提架构设计的核心目的的良苦用心了吧 ：）</p>
    <hr>
    <p><img src="https://static001.geekbang.org/resource/image/06/bf/06fa4a874cda142e768f64260087a4bf.jpeg" alt="﻿![](https://images-cdn.shimo.im/xoY4QiOViOcOnXhd/ 李运华 s2_5.jpeg!thumbnail)﻿"></p>
    <p>华仔：实现起来细节较多，但没有想象的那么复杂，一般的公司如果有人力的话，做一个简单够用的消息队列不难，用 MySQL 做存储的话，不到 1 万行代码就可以搞定。</p>
    <hr>
    <p><img src="https://static001.geekbang.org/resource/image/48/d7/48e3036370c23ad5cd84b5aeb7a48fd7.jpeg" alt="﻿![](https://images-cdn.shimo.im/KVZfDtWTDVozMbWp/ 李运华 s2_6.jpeg!thumbnail)﻿"></p>
    <p>华仔：如有雷同，实属巧合，确认过眼神，我不是你们公司的人 ^_^</p>
    <hr>
    <p><img src="https://static001.geekbang.org/resource/image/9a/6e/9ad8b84a03ab5f9679e0596216f4f56e.jpeg" alt=""></p>
    <p>华仔：架构师确实需要在技术广度和技术深度两方面都要兼顾，但如何把握技术深度这个“度”，不同架构师有不同的理解，但千万不能说“细节不讨论”“你上网搜”，这样会没有技术公信力。</p>
    <hr>
    <p>最后，再次恭喜<span class="orange">@Tony</span>、<span class="orange">@Michael</span>、<span class="orange">@空档滑行</span>、<span class="orange">@bluefantasy</span>、<span class="orange">@东</span>、<span class="orange">@ant</span>，也感谢写下留言的每位同学。欢迎你在这期“华仔，放学别走”留下你的问题，业务、职场、职业规划等不限主题，可以和华仔一起聊聊专栏以外的话题。</p>
    <!-- [[[read_end]]] -->
    <p><img src="https://static001.geekbang.org/resource/image/ba/37/ba6fcd186893b8cc9977d18e1fa5ab37.jpg" alt=""></p>
</div></div> <p data-v-87ffcada="" style="color: rgb(153, 153, 153);">
    版权归极客邦科技所有，未经许可不得转载
</p></div> <div data-v-87ffcada="" class="article-comments"><h2 data-v-87ffcada=""><span data-v-87ffcada="">精选留言</span></h2> <ul data-v-87ffcada=""><li data-v-87ffcada="" class="comment-item"><img src="http://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTLwcziaqgjxBcZvDb3zA34duGARjNmiaXHCSvH2RibM4sCMhPWfgSOzqdTc30PebbTYOicwGw1fVRSI3A/132" class="avatar"> <div class="info"><div class="hd"><span class="username">爱吃技术的🐱</span> <div class="control"><!----> <a href="javascript:;" class="btn-praise"><i class="iconfont"></i> <span>5</span></a></div></div> <div class="bd">企业高速发展过程中，技术总是短期内被高估，长期被低估，一位15年IT老兵的切身感受！</div> <span class="time">2018-06-02</span> <div class="reply"><div class="reply-hd"><i class="iconfont"></i> <span>作者回复</span></div> <p class="reply-content">我理解是短期被牺牲，长期被低估😂😂</p> <p class="reply-time">2018-06-02</p></div></div></li><li data-v-87ffcada="" class="comment-item"><img src="https://static001.geekbang.org/account/avatar/00/10/3a/85/8e32883f.jpg" class="avatar"> <div class="info"><div class="hd"><span class="username">张国胜</span> <div class="control"><!----> <a href="javascript:;" class="btn-praise"><i class="iconfont"></i> <span>0</span></a></div></div> <div class="bd">之前在公司遇到的问题是，拿演化当挡箭牌，导致根本没有架构就直接开干。演化优于过度设计，我的理解是，演化要站在上帝视角，能看到一定程度的将来，然后从多种设计方案中选择最基本的那一种，就像有了最小子集，这是后续演化的基石，最好不要推到重来，如果要重来也要尽早。而不能无设计作为起点。</div> <span class="time">2018-06-29</span> <div class="reply"><div class="reply-hd"><i class="iconfont"></i> <span>作者回复</span></div> <p class="reply-content">是的，演化优于过度设计不是说不要设计，而是不要过度设计</p> <p class="reply-time">2018-06-30</p></div></div></li><li data-v-87ffcada="" class="comment-item"><img src="https://static001.geekbang.org/account/avatar/00/10/b8/3c/09d86b6f.jpg" class="avatar"> <div class="info"><div class="hd"><span class="username">Panda</span> <div class="control"><!----> <a href="javascript:;" class="btn-praise"><i class="iconfont"></i> <span>0</span></a></div></div> <div class="bd">目前公司的项目并发量不大，项目比较复杂，逻辑复杂度高，多个项目耦合强，请老师分享一下这种情况下的架构 应该怎么做</div> <span class="time">2018-06-04</span> <div class="reply"><div class="reply-hd"><i class="iconfont"></i> <span>作者回复</span></div> <p class="reply-content">可扩展章节有讨论</p> <p class="reply-time">2018-06-06</p></div></div></li><li data-v-87ffcada="" class="comment-item"><img src="http://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTLI6icTKbDkttOj8EQKuedOmgZ2siaQSdBBpbH4e0up0Tk5csianrkHsBllQx2bZ03spibDFiaDTT4eGMA/132" class="avatar"> <div class="info"><div class="hd"><span class="username">东</span> <div class="control"><!----> <a href="javascript:;" class="btn-praise"><i class="iconfont"></i> <span>0</span></a></div></div> <div class="bd">忽然发现上了热门，有种被翻牌子的感觉!</div> <span class="time">2018-06-04</span> <!----></div></li></ul></div></div> <!----> <!----></div></div>
</body>
</html>